Faster R-CNN论文阅读笔记及相关资料总结

声明:这几天重新学习Faster R-CNN,找到了很多好的博客资料,在此附上地址,方便以后学习,文中的图均来自于这些资料。

网络整体架构图

论文中给出的架构图是这样的,基本忽略了所有细节,以下是其他资料中的图片:

Faster R-CNN = Fast R-CNN + RPN,学习Faster R-CNN最重要的就是搞懂RPN及其Anchor机制,这篇文章并不会深入谈这个,会附上看过的比较好的博客,供学习。学习Faster R-CNN,最重要的还是能看一遍代码实现,毕竟看了论文还是一头雾水。

从原理上讲,Faster R-CNN分为以下四部分:

  1. Conv layers。使用VGG、ResNet等网络提取图像的feature maps,该feature maps被共享用于后续的网络。
  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
  3. Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

从编程角度讲,Faster R-CNN分为以下四部分:

  1. Dataset:数据,提供符合要求的数据格式(目前常用数据集是VOC和COCO)

  2. Extractor: 即上面提到的Conv layers

  3. RPN(Region Proposal Network): 负责提供候选区域rois(每张图给出大概2000个候选框)

  4. RoIHead: 负责对rois分类和微调。对RPN找出的rois,判断它是否包含目标,并修正框的位置和座标

特别容易忽略的是数据的处理部分,RPN网络的训练,需要的标签是需要自己生成的:

再附一张以VGG16为特征提取网络的Faster R-CNN网络结构图:

理解Faster R-CNN的几个关键点

  1. Anchor的理解,在feature maps与原图之间如何映射

  2. BBox,全称是bounding box,边界框。有以下几种BBox:

    • Ground Truth Bounding Box是每一张图中人工标注的框的位置,一张图中有几个目标,就有几个框。
    • Anchor BBox
    • Predict Bounding Box,Faster R-CNN的预测结果
  3. ROIs的理解,如何生成的

  4. Faster R-CNN的四类损失函数的理解,尤其是回归损失:

    • RPN 分类损失:anchor是否为前景(二分类)
    • RPN位置回归损失:anchor位置微调
    • RoI 分类损失:RoI所属类别(21分类,多了一个类作为背景)
    • RoI位置回归损失:继续对RoI位置微调
  5. 三个Creater的理解:

    • AnchorTargetCreator : 负责在训练RPN的时候,从上万个anchor中选择一些(比如256)进行训练,以使得正负样本比例大概是1:1. 同时给出训练的位置参数目标。 即返回gt_rpn_locgt_rpn_label
    • ProposalTargetCreator: 负责在训练RoIHead/Fast R-CNN的时候,从RoIs选择一部分(比如128个)用以训练。同时给定训练目标, 返回(sample_RoI, gt_RoI_loc, gt_RoI_label
    • ProposalCreator: 在RPN中,从上万个anchor中,选择一定数目(2000或者300),调整大小和位置,生成RoIs,用以Fast R-CNN训练或者测试

    其中AnchorTargetCreatorProposalTargetCreator是为了生成训练的目标,只在训练阶段用到,ProposalCreator是RPN为Fast R-CNN生成RoIs,在训练和测试阶段都会用到。

  6. AnchorTargetCreator将20000多个候选的anchor选出256个anchor进行分类和回归位置。选择过程如下:

    • 对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本
    • 对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。
    • 随机选择和gt_bbox重叠度小于0.3的anchor作为负样本。负样本和正样本的总数为256。

    ProposalCreator 生成ROIs的过程如下:

    • 对于每张图片,利用它的feature map, 计算 (H/16)× (W/16)×9(大概20000)个anchor属于前景的概率,以及对应的位置参数。
    • 选取概率较大的12000个anchor
    • 利用回归的位置参数,修正这12000个anchor的位置,得到RoIs
    • 利用非极大值((Non-maximum suppression, NMS)抑制,选出概率最大的2000个RoIs

    注意:在inference的时候,为了提高处理速度,12000和2000分别变为6000和300.

    对于2000个RoIs,这2000个RoIs不是都拿去训练,而是利用ProposalTargetCreator 选择128个RoIs用以训练。选择的规则如下:

    • RoIs和gt_bboxes 的IoU大于0.5的,选择一些(比如32个)
    • 选择 RoIs和gt_bboxes的IoU小于等于0(或者0.1)的选择一些(比如 128-32=96个)作为负样本
  7. Faster R-CNN的训练过程的理解:

参考资料

  1. 论文
  2. 一文读懂Faster RCNN
  3. Faster R-CNN
  4. 从编程实现角度学习Faster R-CNN(附极简实现)
  5. 一文教你如何用PyTorch构建 Faster RCNN
  6. Faster R-CNN: Down the rabbit hole of modern object detection
  7. Object Detection and Classification using R-CNNs
  8. pytorch 实现 faster rcnn — 1
  9. pytorch 实现 faster rcnn — 2
  10. faster rcnn和ssd 中为什么用smooth l1 loss,和l2有什么区别?